package mianshi;

/**
 * description:
 * author:zt
 * date:2021-08-06
 */

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Stack;

/**
 * 堆盘子。设想有一堆盘子，堆太高可能会倒下来。因此，在现实生活中，盘子堆到一定高度时，我们就会另外堆一堆盘子。请实现数据结构SetOfStacks，模拟这种行为。
 * SetOfStacks应该由多个栈组成，并且在前一个栈填满时新建一个栈。此外，SetOfStacks.push()和SetOfStacks.pop()应该与普通栈的操作方法相同（也就是说，pop()返回的值，应该跟只有一个栈时的情况一样）。
 * 进阶：实现一个popAt(int index)方法，根据指定的子栈，执行pop操作。
 *
 * 当某个栈为空时，应当删除该栈。当栈中没有元素或不存在该栈时，pop，popAt应返回 -1.
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
public class _03_03 {
    class StackOfPlates {
        ArrayList<LinkedList<Integer>> res;
        int cap;
        public StackOfPlates(int cap) {
            this.res = new ArrayList<>();
            this.cap = cap;
        }

        public void push(int val) {
            // 如果栈深小于0
            if (cap <= 0) {
                return;
            }
            // 如果当前没有栈，则需要新建栈
            if (res.isEmpty()) {
                res.add(new LinkedList<Integer>());
            }
            //如果当前最近的栈满，则需要新建栈
            if (res.get(res.size() - 1).size() >= cap) {
                res.add(new LinkedList<Integer>());
            }
            //再取最近的栈push
            LinkedList<Integer> stack = res.get(res.size() - 1);
            stack.push(val);
        }

        public int pop() {
            if (res.isEmpty()) return -1;
            int ans = res.get(res.size() - 1).pop();
            if (res.get(res.size()-1).size()<1) res.remove(res.size()-1);
            return ans;
        }

        public int popAt(int index) {
            // 如果索引不在栈表内
            if(res.size() <= 0 || index > res.size() - 1) {
                return  -1;
            }
            // 弹出
            LinkedList<Integer> stack = res.get(index);
            Integer pop = stack.pop();
            // 若为空栈则删除
            if(stack.isEmpty()) {
                res.remove(index);
            }
            return pop;
        }
    }
}
